/*!
* 文件名     main.c
* 作者       聚沃科技
* 版本       V1.0
* 实验简介   EXMC-外部SRAM读写实验
*/

/*
* 版权说明
* 本程序只供学习使用，未经作者许可，不得用于其它任何用途
* GD32F303东方红开发板V1
* 在线购买：   http://juwo.taobao.com
* 技术交流：   http://www.gd32bbs.com/ask/
* 视频学习：   https://space.bilibili.com/475462605
* 微信公众号： gd32bbs
* 创建日期:    2023/8/30
* Copyright    苏州聚沃电子科技有限公司
* 版权所有，盗版必究。
*/

#include "app_sdcard.h"

#include "bsp_led.h"
#include "bsp_sdcard.h"

#include "driver_public.h"

#include "FreeRTOS.h"
#include "task.h"


//#define INIT_TASK_PRIO   ( tskIDLE_PRIORITY + 1 )
//#define DISPLAY_TASK_PRIO    ( tskIDLE_PRIORITY + 3 )

sd_card_info_struct sd_cardinfo;                            /* information of SD card */


/*!
    \brief      get the card information and print it out by USRAT
    \param[in]  none
    \param[out] none
    \retval     none
*/
void card_info_get(void)
{
    uint8_t sd_spec, sd_spec3, sd_spec4;
    sd_spec = (sd_scr[1] & 0x0F000000) >> 24;
    sd_spec3 = (sd_scr[1] & 0x00008000) >> 15;
    sd_spec4 = (sd_scr[1] & 0x00000400) >> 10;
    if(2 == sd_spec)
    {
        if(1 == sd_spec3)
        {
            if(1 == sd_spec4) 
            {
                printf_log("  # Card version 4.xx\r\n");
            }
            else 
            {
                printf_log("  # Card version 3.0x\r\n");
            }
        }
        else 
        {
            printf_log("  # Card version 2.00\r\n");
        }
    }
    else if(1 == sd_spec) 
    {
        printf_log("  # Card version 1.10\r\n");
    }
    else if(0 == sd_spec) 
    {
        printf_log("  # Card version 1.0x\r\n");
    }
    
    printf_log("  # Device size is %dKB\r\n", sd_card_capacity_get());
}

/*!
    \brief      initialize the card, get the card information, set the bus mode and transfer mode
    \param[in]  none
    \param[out] none
    \retval     sd_error_enum
*/
sd_error_enum sd_io_init(void)
{
    sd_error_enum status = SD_OK;
    uint32_t cardstate = 0;
    
    nvic_irq_enable(SDIO_IRQn, 0, 0);
    
    status = sd_init();
    if(SD_OK == status){
        status = sd_card_information_get(&sd_cardinfo);
    }
    if(SD_OK == status){
        status = sd_card_select_deselect(sd_cardinfo.card_rca);
    }
    status = sd_cardstatus_get(&cardstate);
    if(cardstate & 0x02000000){
     //   printf_log("\r\n the card is locked!");
        while (1){
        }
    }
    if ((SD_OK == status) && (!(cardstate & 0x02000000)))
    {
        /* set bus mode */
        status = sd_bus_mode_config(SDIO_BUSMODE_4BIT);
//        status = sd_bus_mode_config( SDIO_BUSMODE_1BIT );
    }
    if (SD_OK == status)
    {
        /* set data transfer mode */
        status = sd_transfer_mode_config( SD_DMA_MODE );
//        status = sd_transfer_mode_config( SD_POLLING_MODE );
    }
    return status;
}




/*!
    \brief      init task
    \param[in]  pvParameters not used
    \param[out] none
    \retval     none
*/
Drv_Err sdcard_test(void)
{    
    sd_error_enum sd_error;
    uint16_t i = 5;    
    /* initialize the card */
    do{
        sd_error = sd_io_init();
    }while((SD_OK != sd_error) && (--i));
    
    if(i){
        return DRV_SUCCESS; 
    }else{
        return DRV_ERROR; 
    }  
}

/*!
* 说明     main函数
* 输入     无
* 输出     无
* 返回值   无
*/
//void display_task(void * pvParameters)
//{    
//    uint64_t tick_temp=0;
//    uint16_t frames_speed=0;    
//    //计算刷整屏速度
//    tick_temp=driver_tick;
//    bsp_lcd_clear(WHITE);
//    frames_speed=driver_tick-tick_temp;
//    
//    //显示log图片
//    bsp_lcd_color_fill(60,0,233,99,(uint16_t*)gImage_log_picture);
//    
//    //设置打印窗口
//    bsp_lcd_printf_init(10,109,bsp_lcd_parameter.width-1,369,FONT_ASCII_24_12,WHITE,BLUE);
//    
//    //打印到LCD    
//    bsp_lcd_printf("GD32F303ZGT6\r\n");
//    bsp_lcd_printf("EXMC LCD Brush Test\r\n");
//    bsp_lcd_printf("LCD ID:%04X\r\n", bsp_lcd_parameter.id);    
//    bsp_lcd_printf("* Suzhou Juwo Electronic\r\n");
//    bsp_lcd_printf("* web: www.gd32bbs.com\r\n");
//    bsp_lcd_printf("* B station: 475462605\r\n");
//    bsp_lcd_printf("* QQ Group: 859440462\r\n");
//    bsp_lcd_printf("* Taobao: juwo.taobao.com\r\n");
//    bsp_lcd_printf("* Official ID: gd32bbs\r\n");        
//    bsp_lcd_printf("frames brush:%d ms\r\n", frames_speed);   

//    //重新设置新的打印窗口
//    bsp_lcd_printf_init(0,370,bsp_lcd_parameter.width-1,bsp_lcd_parameter.height-1,FONT_ASCII_12_6,BLUE,~BLUE);

//    while (1)
//    {
//        //将摇杆采集结果处理控制LCD亮度
//        bsp_lcd_backlight_duty_set(100-(0xfff-Rocker_data[0])*100/0xfff);
//        
//        //打印亮度信息到LCD
//        bsp_lcd_printf("* backlight is %d",100-(0xfff-Rocker_data[0])*100/0xfff); 
//        bsp_lcd_printf("      ");
//        //打印系统tick到LCD
//        bsp_lcd_printf("* system tic is %lld \r\n",driver_tick);    
//        vTaskDelay(200);                                                  
//    }
//}

